/**
 * 统一错误处理工具
 */
import { message, notification } from 'ant-design-vue'
import type { API } from '@/types/api/response'
import i18n from '@/locales'

// 获取翻译函数
const { t } = i18n.global

/**
 * 错误类型枚举
 */
export enum ErrorType {
  /** API响应错误 */
  API = 'api',
  /** 表单验证错误 */
  VALIDATION = 'validation',
  /** 网络请求错误 */
  NETWORK = 'network',
  /** 未知错误 */
  UNKNOWN = 'unknown'
}

/**
 * 统一错误处理
 * @param error 错误对象
 * @param type 错误类型
 * @param customMessage 自定义错误信息
 * @param shouldLog 是否记录日志
 */
export const handleError = (
  error: any,
  type: ErrorType = ErrorType.UNKNOWN,
  customMessage?: string,
  shouldLog = true
): void => {
  // 获取错误信息
  let errorMessage = customMessage || getErrorMessage(error, type)
  
  // 显示错误信息
  showErrorMessage(errorMessage, type)
  
  // 记录错误日志
  if (shouldLog) {
    logError(error, type, errorMessage)
  }
}

/**
 * 获取错误信息
 * @param error 错误对象
 * @param type 错误类型
 */
const getErrorMessage = (error: any, type: ErrorType): string => {
  switch (type) {
    case ErrorType.API:
      return getApiErrorMessage(error)
    case ErrorType.VALIDATION:
      return getValidationErrorMessage(error)
    case ErrorType.NETWORK:
      return getNetworkErrorMessage(error)
    case ErrorType.UNKNOWN:
    default:
      return error?.message || t('error.unknown')
  }
}

/**
 * 获取API错误信息
 * @param error API错误对象
 */
const getApiErrorMessage = (error: any): string => {
  // API响应错误
  if (error?.response?.data) {
    const { message: msg, code } = error.response.data as API.Response<any>
    if (msg) {
      return t('error.errorCode', { code: code || 'ERROR', message: msg })
    }
  }
  
  // 尝试从error对象中获取信息
  return error?.message || t('error.apiResponse')
}

/**
 * 获取表单验证错误信息
 * @param error 验证错误对象
 */
const getValidationErrorMessage = (error: any): string => {
  if (error?.errors && Array.isArray(error.errors)) {
    // 多个验证错误，返回第一个
    return error.errors[0]?.message || t('error.validation')
  }
  
  if (error?.errors && typeof error.errors === 'object') {
    // 获取第一个字段的第一个错误
    const fieldName = Object.keys(error.errors)[0]
    const fieldError = error.errors[fieldName]?.[0]
    return fieldError || t('error.fieldValidation', { field: fieldName })
  }
  
  return error?.message || t('error.validation')
}

/**
 * 获取网络错误信息
 * @param error 网络错误对象
 */
const getNetworkErrorMessage = (error: any): string => {
  if (error?.code === 'ECONNABORTED' || error?.message?.includes('timeout')) {
    return t('error.timeout')
  }
  
  if (error?.message?.includes('Network Error')) {
    return t('error.network')
  }
  
  return error?.message || t('error.networkGeneral')
}

/**
 * 显示错误信息
 * @param message 错误信息
 * @param type 错误类型
 */
const showErrorMessage = (msg: string, type: ErrorType): void => {
  if (type === ErrorType.API) {
    // API错误使用通知
    notification.error({
      message: t('error.apiTitle'),
      description: msg,
      duration: 4.5
    })
  } else if (type === ErrorType.NETWORK) {
    // 网络错误使用通知
    notification.error({
      message: t('error.networkTitle'),
      description: msg,
      duration: 4.5
    })
  } else {
    // 其他错误使用消息提示
    message.error(msg)
  }
}

/**
 * 记录错误日志
 * @param error 错误对象
 * @param type 错误类型
 * @param message 错误信息
 */
const logError = (error: any, type: ErrorType, msg: string): void => {
  console.group(t('error.errorType', { type }))
  console.error(t('error.errorMessage', { message: msg }))
  console.error(t('error.errorDetail'), error)
  console.groupEnd()
  
  // TODO: 可以在这里集成错误上报服务，如Sentry等
  // if (process.env.NODE_ENV === 'production') {
  //   Sentry.captureException(error);
  // }
}

/**
 * 包装异步操作，提供统一错误处理
 * @param promise 异步操作Promise
 * @param errorType 错误类型
 * @param customErrorMessage 自定义错误信息
 * @param successCallback 成功回调
 */
export const withErrorHandling = async <T>(
  promise: Promise<T>,
  errorType: ErrorType = ErrorType.API,
  customErrorMessage?: string,
  successCallback?: (data: T) => void
): Promise<T | null> => {
  try {
    const result = await promise
    successCallback?.(result)
    return result
  } catch (error) {
    handleError(error, errorType, customErrorMessage)
    return null
  }
}

/**
 * 处理API错误
 * @param error API错误对象
 * @param customMessage 自定义错误信息
 */
export const handleApiError = (error: any, customMessage?: string): void => {
  handleError(error, ErrorType.API, customMessage)
}

/**
 * 处理表单验证错误
 * @param error 验证错误对象
 * @param customMessage 自定义错误信息
 */
export const handleValidationError = (error: any, customMessage?: string): void => {
  handleError(error, ErrorType.VALIDATION, customMessage)
} 